package gxm

import (
	"fmt"

	"gitee.com/liumou_site/logger"
	"github.com/xuri/excelize/v2"
)

// ReadAll 读取Excel文件中的所有数据
//
// 返回值：
//
//	*ApiRead - 支持链式调用的ApiRead指针
//
// 说明：
//   - 打开指定的Excel文件并读取所有工作表数据
//   - 读取的数据存储在Data字段中，为二维字符串切片格式
//   - 如果文件不存在或读取失败，会设置api.Err错误
//   - 支持链式操作，可以连续调用其他方法
//   - 默认使用创建时指定的SheetName（通常为"Sheet1"）
//
// 示例：
//
//	reader := gxm.NewRead("data.xlsx")
//	data := reader.ReadAll().Data
//	if reader.Err != nil {
//	    fmt.Printf("读取失败: %v\n", reader.Err)
//	}
func (api *ApiRead) ReadAll() *ApiRead {
	var ReadFile *excelize.File
	ReadFile, api.Err = excelize.OpenFile(api.FileName)
	if api.Err != nil {
		fmt.Println(api.Err)
		return api
	}
	defer func() {
		if err := ReadFile.Close(); err != nil {
			logger.Error(err.Error())
		}
	}()
	api.Data, api.Err = ReadFile.GetRows(api.SheetName) // 通过Sheet名称获取表格中所有单元格
	return api
}

// CutLine 获取指定行的数据
//
// 参数：
//
//	line - 行号，从0开始（0表示第1行）
//
// 返回值：
//
//	*ApiRead - 支持链式调用的ApiRead指针
//
// 说明：
//   - 从已读取的数据中提取指定行的数据
//   - 提取的行数据存储在DataRow字段中
//   - 如果line为负数，会设置api.Err错误并返回
//   - 需要先调用ReadAll()读取数据后才能使用
//   - 支持链式操作，可以连续调用多个方法
//
// 示例：
//
//	reader.ReadAll().CutLine(0)  // 获取第1行数据
//	if reader.Err == nil {
//	    fmt.Printf("第1行数据: %v\n", reader.DataRow)
//	}
func (api *ApiRead) CutLine(line int) *ApiRead {
	// 参数验证：检查行号是否为负数
	if line < 0 {
		api.Err = fmt.Errorf("行号不能为负数")
		logger.Error(api.Err)
		return api
	}

	// 验证是否已经读取数据
	if len(api.Data) >= 1 {
		if len(api.Data) > line {
			api.DataR = api.Data[line : line+1]
			api.DataRow = api.DataR[0]
			return api
		} else {
			api.Err = fmt.Errorf("读取数据行数小于截取数据行数")
		}
	} else {
		api.Err = fmt.Errorf("请先读取数据再切割")
	}
	logger.Error(api.Err)
	return api
}
